#!/usr/bin/env bash
#-------------------------------------------------------
#	FileName	: ptask.sh
#	Author		：hpy
#	Date		：2020年07月07日
#	Description	：MyTask命令传递工具
#-------------------------------------------------------
DIR=$(dirname $0) 
cd $DIR
DIR=$(pwd) 
CMDFILE="$DIR/cmd.src"
PIC="$DIR/icon.jpg"
RUNTASK="$DIR/run.flag"
DB="$DIR/db.dat" #任务存放数据库
TIMEDB="$DIR/time.dat"
FLAG_FILE="$DIR/flag.dat"
TPFILE="$DIR/tp.src"
HISTORY="$DIR/History.dat"
#主函数
main(){
	cmd=$1
	#if [[ $(isRun) -eq 0 ]];then
	#	echo "MyTask任务没有启动，请先启动任务！"
	#	exit 1
	#fi
	case $cmd in 
		'-h')
			ptaskHelp
			;;
		'-c')
			ptaskTime
			;;
		'-l')
			ptaskList
			;;
		'-H')
			ptaskHisList
			;;
		'-Hw')
			dis_task $HISTORY "已完成任务列表" 
			;;
		'-n')
			ptaskNew $2 $3
			;;
		'-q')
			ptaskStop
			;;
		'-s')
			ptaskStart &
			;;
		'-nw')
			ptaskNew_w
			;;
		'-clear')
			ptaskClear
			;;
		'-lw')
			dis_task $DB "任务列表" 
			;;
		'-w')
			ptask_w
			;;
		*)
			echo "使用 ptask -h 查看帮助";;
	esac

	exit 0
}

ptaskHelp(){

cat<<EOF
Usage : ptask [option] <..>
需保证主线任务已经启动

 -h            显示帮助
 -c            查看当前任务还有多少时间 
 -l            查看任务列表  
 -lw           查看任务列表(弹出窗口形式)
 -H            历史任务列表 
 -Hw           已完成任务列表(弹出窗口形式)
 -nw           新建任务(弹窗建立任务)
 -q            停止此次任务
 -s            开启任务列表中的第一个任务
 -w            可视化界面打开
 -clear        删除所有未完成的任务
 -n time note  新建任务
EOF
}
#可视化界面
ptask_w(){
	CREATETASK="添加任务"
	STARTTASK="启动任务"
	STOPTASK="停止任务"
	TASKLIST="任务列表"
	HISTASK="历史任务"
	NOWTASK="当前任务"
	CLEAR="重置任务"
	DELTASK="删除任务"
	
	while true
	do
		##1，列表单选框
		cmd=$(zenity --list --radiolist --width 150 --height 300 \
			--text="任务菜单" \
			--column="选择" \
			--column="功能" \
			TRUE $NOWTASK\
			FALSE $CREATETASK\
			FALSE $STARTTASK\
			FALSE $STOPTASK\
			FALSE $TASKLIST\
			FALSE $HISTASK\
			FALSE $DELTASK\
			FALSE $CLEAR)
		## 处理自定义函数的结果
		case $cmd in
			$CREATETASK)
				ptaskNew_w  ;;
			$TASKLIST)
				dis_task $DB "任务列表" 
				;;
			$HISTASK)
				dis_task $HISTORY "已完成的任务列表"
				;;
			$NOWTASK)
				ptaskTime	
				;;
			$CLEAR)
				flag_cfg 0
				cat /dev/null > $HISTORY
				cat /dev/null > $DB 
				cat /dev/null > $FLAG_FILE
				cat /dev/null > $TIMEDB
				tell "已完成清理任务!"
				;;
			$DELTASK)
				delTask
				;;
			$STARTTASK)
				ptaskStart &
				;;
			$STOPTASK)
				ptaskStop
				;;
			*)break	;;	
		esac
	done
}

#删除任务
delTask(){
	list_cmd="zenity --list --title='$2' --column='ID' --column='时间(分钟)' --column='任务说明'"
	tfile="$DIR/tfile.tmp"
	if [[ $(flag_get) -eq 0 ]];then
		cat $DB > $tfile
	else
		tail -n +2 $DB > $tfile
	fi
	while read line
	do
		d1=$(echo $line | cut -d'|' -f1 )
		d2=$(echo $line | cut -d'|' -f2 )
		d3=$(echo $line | cut -d'|' -f3 ) 
		list_cmd="$list_cmd '$d1' '$d2' '$d3'"
	done < $tfile
	ans=$(eval $list_cmd)
	if [ -z $ans ];then
		return
	fi
	zenity --question --text="你确定要删除这个任务吗？"
	if [[ $? -eq 0 ]];then
		cmd_str="sed -i '/$ans/d' $DB"
		eval $cmd_str
		zenity --notification\
    	--window-icon="$PIC" \
    	--text="MyTask:已删除ID为$ans的任务！请选择工作状态，重新启动任务!"
	fi
}

ptaskClear(){
	read -p "你确定要清理所有任务吗？这会删除未完成任务列表中的所有任务和历史记录！yes/no?" usr_in
	if [ "$usr_in" = "yes" ] || [ "$usr_in" = "y" ];then
		cat /dev/null > $DB
		cat /dev/null > $HISTORY
		tell "已经完成清理工作！"
	fi	
}
#启动任务线程
ptaskStart(){
	if [[ $(flag_get) -eq 1 ]];then
		tell "当前已有任务在执行！"
		exit 1
	fi
	flag_cfg 1
	while [[ $(flag_get) -eq 1 ]]
	do 
		if [ ! -f $DB ];then
			tell "不存在任务!"
			return 1
		fi

		taskNow=$(cat $DB | head -n +1)
		
		if [ -z "$taskNow" ];then
			tell "不存在任务！请先创建任务！"
			flag_cfg 0
			exit 0
		fi
		TaskId=$(echo $taskNow | cut -d'|' -f1)
		TaskTime=$(echo $taskNow | cut -d'|' -f2)
		TaskNote=$(echo $taskNow | cut -d'|' -f3)
		tell "MyTask:已开启 [--$TaskNote--] 任务！预计时间$TaskTime分钟！"

		calTimer $taskNow $TaskId $TaskTime $TaskNote #任务计时器
	done
}

#分钟计时器 calTimer m  等待m
calTimer(){
	timeM=$3
	taskNow=$1
	TaskId=$2
	TaskTime=$3
	TaskNote=$4

	while [[ $timeM -gt 0 ]] && [[ $(flag_get) -eq 1 ]]  #分钟
	do
		echo $timeM > $TIMEDB
		secCnt=0
		if [[ $timeM -eq 1 ]];then
			tell "MyTask:\"$TaskNote\"任务还有1分钟！"
		fi
		while [[ $secCnt -lt 60 ]]&& [[ $(flag_get) -eq 1 ]]
		do
			sleep 1
			#echo $secCnt
			secCnt=$[secCnt+1]
		done 
		timeM=$[timeM-1]
	done

	if [[ $(flag_get) -eq 0 ]];then
		#tell "MyTask:结束应用!"
		exit 0
	fi
	#zenity --info --text="任务时间到！"
	tell "MyTask:任务完成!自动移除本任务！"
	taskNow=$(cat $DB | head -n +1)

	echo $taskNow >> $HISTORY  #加入历史任务列表
	sed -i '1d' $DB 
	flag_cfg 0  #自动退出任务
}
#停止此次任务
ptaskStop(){
	if [[ $(flag_get) -eq 1 ]];then
		flag_cfg 0
		taskNow=$(cat $DB | head -n +1)
		TaskNote=$(echo $taskNow | cut -d'|' -f3)
		tell "已停止[--$TaskNote--]任务！"
	else
		tell "没有正在执行的任务!"
	fi
}

#新建任务
ptaskNew(){
	TaskId=$(date +%Y%m%d%H%M%S) 
	TaskTime=$1
	TaskNote=$2
	if [ -n "$(echo $TaskTime | sed -n "/^[0-9]\+$/p")" ] && [ -n "$TaskNote" ];then
		echo "$TaskId|$TaskTime|$TaskNote" >> $DB
		tell "已新建$TaskNote任务！"
	else
		tell "新建任务失败，输入有误！"
		echo "新建任务失败，输入有误！"
	fi

}

#创建任务
ptaskNew_w(){
	if [ ! -f $DB ];then
		touch $DB
	fi
	#添加任务
	tList=$(zenity --forms --title="添加任务" \
	--text="完善以下信息"  \
	--separator="|"  \
	--add-entry="时间(分钟)"  \
	--add-entry="任务说明"  )
	
	time=$(echo $tList | cut -d'|' -f1 )
	note=$(echo $tList | cut -d'|' -f2 )
	
	if [ -n "$(echo $time | sed -n "/^[0-9]\+$/p")" ] && [ -n "$note" ];then
		id=$(date +%Y%m%d%H%M%S)
		echo "$id|$tList" >> $DB 
		tell "MyTask:完成任务添加！"
	else
		tell "MyTask:操作失败！预计时间输入的不是数字！或者任务说明没有输入！"
		return 
	fi 
		
}

#任务列表
ptaskList(){
	echo "---------------- 存在的任务 ----------------" 
	echo "ID|时间(分钟)|任务说明" > $TPFILE
 	cat $TPFILE $DB | column -s '|' -t
	echo ""
}

#历史任务列表
ptaskHisList(){
	echo "---------------- 完成的任务 ----------------"
	echo "ID|时间(分钟)|任务说明" > $TPFILE
 	cat $TPFILE $HISTORY | column -s '|' -t
	echo ""
}
#查看时间
ptaskTime(){
	if [[ $(flag_get) -eq 0 ]];then
		tell "没有启动任务"
	else
		taskNow=$(cat $DB | head -n +1)
		
		if [ -z "$taskNow" ];then
			tell "不存在任务！退出任务列表！"
			flag_cfg 0
			exit 0
		fi
		TaskId=$(echo $taskNow | cut -d'|' -f1)
		TaskTime=$(echo $taskNow | cut -d'|' -f2)
		TaskNote=$(echo $taskNow | cut -d'|' -f3)
		ltime=$(cat $TIMEDB) 
		tell "当前正在执行[--$TaskNote--]任务，剩余时间$ltime分钟！"
	
	fi
}

#通知函数
tell(){
	echo "MyTask:$*"
	zenity --notification\
    --window-icon="$PIC" \
    --text="MyTask:$*" &> /dev/null
}

flag_cfg(){
	echo $1 > $FLAG_FILE
	FLAG=$1
}
flag_get(){
	FLAG=$(cat $FLAG_FILE)
	echo $FLAG
}

isRun(){
	cat $RUNTASK
}
#显示任务列表
dis_task(){
	list_cmd="zenity --list --title='$2' --column='ID' --column='时间(分钟)' --column='任务说明'"
	while read line
	do
		d1=$(echo $line | cut -d'|' -f1 )
		d2=$(echo $line | cut -d'|' -f2 )
		d3=$(echo $line | cut -d'|' -f3 ) 
		list_cmd="$list_cmd '$d1' '$d2' '$d3'"
	done < $1
	list_cmd="$list_cmd &>/dev/null"
	eval $list_cmd 
}

#调用主函数
main $*
